package pms.dao;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import pms.om.Abteilung;
import pms.om.Mitarbeiter;

public class AbteilungDao extends HibernateDaoSupport {

	/**
	 * R&uuml;ckgabe einer {@link Abteilung} anhand der Id
	 * @param id
	 * @return ausgew&auml;hlte Abteilung
	 */
	
	public Abteilung findById(int id) {
		HibernateTemplate template = getHibernateTemplate();
		return (Abteilung) template.get(Abteilung.class, id);
	}

	/**
	 * R&uuml;ckgabe aller Abteilungen
	 * @return alle Abteilungen
	 */
	
	@SuppressWarnings("unchecked")
	public Set<Abteilung> findAll() {
		HibernateTemplate template = getHibernateTemplate();
		List<Abteilung> alleabteilungen = template.loadAll(Abteilung.class);
		Set<Abteilung> results = new HashSet<Abteilung>();
		for (Abteilung abteilung : alleabteilungen) {
			results.add(abteilung);			
		}
		return results;
	}

	/**
	 * Anlegen einer neuen Abteilung
	 * @param abteilungsname
	 * @param maximal_duerfen_gleichzeitig_fehlen
	 */
	
	public void create(String abteilungsname, String maximal_duerfen_gleichzeitig_fehlen) {
		HibernateTemplate template = getHibernateTemplate();
		Abteilung a = new Abteilung(abteilungsname, maximal_duerfen_gleichzeitig_fehlen);
		template.persist(a);
	}

	/**
	 * &Auml;ndern der Abteilung anhand der ausgew&auml;hlten Id auf die neuen 
	 * &uuml;bergebenen Eigenschaften
	 * @param id
	 * @param abteilungsname
	 * @param maximal_duerfen_gleichzeitig_fehlen
	 */
	
	public void modify(int id, String abteilungsname, String maximal_duerfen_gleichzeitig_fehlen) {
		HibernateTemplate template = getHibernateTemplate();
		Abteilung a = (Abteilung) template.get(Abteilung.class, id);
		a.setAbteilungsname(abteilungsname);
		a.setMaximal_duerfen_gleichzeitig_fehlen(maximal_duerfen_gleichzeitig_fehlen);
		template.saveOrUpdate(a);
		template.flush();
		}

	/**
	 * L&ouml;schen der ausgew&auml;hlten Abteilung
	 * @param id
	 */
	
	public boolean deleteById(int id) {
		HibernateTemplate template = getHibernateTemplate();
		boolean result = false;
		Abteilung a = findById(id);  // zunächste suche die Abteilung mit der id
		if (a.getMitarbeiterinabteilung().isEmpty()) {
			template.delete(a); // dann löschen
			template.flush();
			result = true;
		}
		return result;
	}
	
	/**
	 * L&ouml;sche einen Mitarbeiter mit der id =idm aus der Abteilung 
	 * mit der id =ida
	 * @param idm
	 * @param ida
	 */

	public void deleteverknuepfungmitarbeiterzuabteilung(int idm, int ida) {
		HibernateTemplate template = getHibernateTemplate();
		Mitarbeiter m = (Mitarbeiter) template.get(Mitarbeiter.class, idm);
		Abteilung a = (Abteilung) template.get(Abteilung.class, ida);
		a.loescheMitarbeiter(m);
		template.saveOrUpdate(a);
		template.flush();
	}
	
	/**
	 * F&uuml;ge einen Mitarbeiter mit der id =idm der Abteilung  mit der 
	 * id =ida zu
	 * @param idm
	 * @param ida
	 */

	public void createverknuepfungmitarbeiterzuabteilung(int idm, int ida) {
		HibernateTemplate template = getHibernateTemplate();
		Mitarbeiter m = (Mitarbeiter) template.get(Mitarbeiter.class, idm);
		Abteilung a = (Abteilung) template.get(Abteilung.class, ida);
		a.fuegeMitarbeiterhinzu(m);
		template.saveOrUpdate(a);
		template.flush();
	}
	
	
	/**
	 * R&uuml;ckgabe der Mitarbeiter einer bestimmten Abteilung anhand der Id
	 * @param id
	 * @return alle Mitarbeiter einer Abteilung
	 */	

	public Set<Mitarbeiter> findeallemitarbeitereinerabteilung(int id) {
		Set<Mitarbeiter> results = findById(id).getMitarbeiterinabteilung();
		return results;
	}

	/**
	 * Pr&uuml;ft, ob maximal_duerfen_gleichzeitig_fehlen passt
	 * Zahl > 0 
	 * @param maximal_duerfen_gleichzeitig_fehlen
	 * @return alle Mitarbeiter einer Abteilung
	 */
	
	public boolean pruefemaximalduerfengleichzeitigfehlen(int maximal_duerfen_gleichzeitig_fehlen) {
		boolean result = false;
		if (maximal_duerfen_gleichzeitig_fehlen > 0) {
			result = true;
		} 
		return result;
	}
		
}



